package cn.itcast.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.itcast.dao.PermissionDao;
import cn.itcast.dao.UserDao;
import cn.itcast.entity.PageResult;
import cn.itcast.pojo.CheckItem;
import cn.itcast.pojo.Role;
import cn.itcast.pojo.User;
import cn.itcast.service.UserService;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import com.github.pagehelper.Page;
import org.springframework.context.annotation.Bean;

import java.util.List;
import java.util.Set;

@Service
@Slf4j
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Autowired
    private PermissionDao permissionDao;

    //密码加密的对象


    /**
     * 根据用户查询出该用户的角色和权限
     * @param userName
     * @return
     */
    @Override
    public User userLogin(String userName) {
        log.debug("用户登录传入的用户名:{}",userName);

        //调用dao层通过用户名和密码查询数据库
        User user = userDao.queryUserByUserName(userName);
        if (user == null){
            return null;
        }

        //根据用户id查询对用的角色
        Set<Role> roleSet = userDao.queryRoleByUserId(user.getId());

        //遍历角色集合通过角色id去查询对应权限
        for (Role role : roleSet) {
            role.setPermissions(permissionDao.queryPermissionByRoleId(role.getId()));
        }
        log.debug("根据用户id查询对用的角色:{}",roleSet);

        user.setRoles(roleSet);

        log.debug("返回的user对象:{}",user);
        //对结果进行判断
        return user;
    }


//    @Autowired
//    private DateUtils dateUtils;

    /**
     * 分页查询数据
     * @param currentPage
     * @param pageSize
     * @param queryString
     * @return
     */
    public PageResult findPageUser(Integer currentPage, Integer pageSize, String queryString) {
        PageHelper.startPage(currentPage, pageSize);

        Page<User> page = userDao.findAllUser();
        return new PageResult(page.getTotal(), page.getResult());
    }

    /**
     * 根据条件模糊查询数据
     * @param currentPage
     * @param pageSize
     * @param queryString
     * @return
     */
    @Override
    public PageResult findUser(Integer currentPage, Integer pageSize, String queryString) {
        PageHelper.startPage(currentPage, pageSize);
        Page<User> page = userDao.findUser(queryString);
        return new PageResult(page.getTotal(), page.getResult());
    }


    @Override
    public List<CheckItem> findCheckItemById(Integer id) {
        return userDao.findCheckItemById(id);
    }

    /**
     * 根据用户id查询角色id
     * @param id
     * @return
     */
    @Override
    public Integer[] findRoleId(Integer id) {
        Integer[] roleId = userDao.findRoleId(id);
        log.info("roleId ==> {}", roleId);
        return roleId;
    }

 /**
     * 添加用户
     * @param user
     * @param roleIds
     * @return
     */
    @Override
    public Boolean insertUser(User user, Integer[] roleIds) {
	//通过user的手机号查询是否有数据判断是否重复
        User user1 = userDao.findByTelephone(user.getTelephone());
        if ( ObjectUtil.isNotEmpty(user1)){
            return false;
        }
        //将前端传递过来的用户信息添加
        userDao.insertUser(user);

        User user2  = userDao.findByTelephone(user.getTelephone());
        for (int s : roleIds) {
            userDao.insertUserRole(s,user2.getId());
        }
        return true;
    }

    /**
     * 修改用户信息
     * @param user
     * @param roleIds
     * @return
     */
    @Override
    public Boolean updateUser(User user, Integer[] roleIds) {
        User user1  = userDao.findByTelephone(user.getTelephone());
        userDao.deleteUserAndRole(user1.getId());

        for (int s : roleIds) {
            userDao.insertUserRole(s,user1.getId());
        }
        userDao.updateUser(user);
        return true;
    }

    /**
     * 根据传入的id
     * 删除中间表信息
     * 删除用户表数据
     * @param id
     */
    @Override
    public void deleteUser(Integer id) {
        userDao.deleteUserAndRole(id);
        userDao.deleteUser(id);
    }

    /**
     * 根据id查找用户信息
     * @param id
     * @return
     */
    @Override
    public User findById(Integer id) {
        return userDao.findById(id);
    }

    /**
     * 查找全部角色信息
     * @return
     */
    @Override
    public List<Role> findAllRole() {
        return userDao.findAllRole();
    }

}
